XACT ABORTを使って途中でエラーになったトランザクションをロールバックする
一つのsqlファイルの中に複数INSERT文を書きまとめて実行する時、途中で一意制約違反エラーになったらどうするか
初期状態
code:cmd.sql
SELECT name, address, tell FROM SAMPLE_TABLE;
table:result.csv
name address tell
Go Japan 070-7777-7777
INSERT
code:cmd.sql
BEGIN TRANSACTION;
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','090-9999-9999');
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','080-8888-8888');
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','070-7777-7777');--これが重複する
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','060-6666-6666');
COMMIT;
エラーになる直前まではINSERTされてしまう
上記の場合はBEGIN TRANSACTIONしているので、落ち着いてROLLBACKすれば元の状態に戻せるが…
実行失敗している時点で、だいたい焦っている
どこまでロールバックすればいいか確実に判断できる自信がない
トランザクションが入れ子になっていたりすると
そもそも一意制約違反エラーになった時点で処理をすべてなかったことにしたい
XACT_ABORT ONで実現できる
デメリットは?
思考: XACT ABORTを使って途中でエラーになったトランザクションをロールバックする
調べた感じ、ロールバックできそうな方法は2つ
1. 検証: XACT_ABORTをONにしてトランザクションを戻す
XACT_ABORTオプションは一回セッションを切るか明示的にXACT_ABORT OFFにしてやると戻る
2. 検証: BEGIN TRANSACTIONとROLLBACKでトランザクションを戻す